#include <iostream>
#include <algorithm>
#include <vector>
#include <list>
using namespace std;

void print(int a)
{
    cout<<a<<" ";
}
int main()
{   
    //非变动算法
    // vector<int > v = {1,2,2,3,3,4,2,3,5};
    // for_each(v.begin(),v.end(),[](int a){cout<<a<<" ";});
    // cout<<endl;
    // cout<<count(v.begin(),v.end(),2)<<endl;
    // cout<<count_if(v.begin(),v.end(),[](int a){return a >= 3;})<<endl;
    // auto ite = min_element(v.begin(),v.end());
    // auto ite = max_element(v.begin(),v.end());
    // auto ite = find(v.begin(),v.end(),2);
    // while(ite != v.end())
    // {
    //     v.erase(ite);
    //     ite = find(v.begin(),v.end(),2);
    // }
    // for_each(v.begin(),v.end(),[](int a){cout<<a<<" ";});
    // auto ite = find_if(v.begin(),v.end(),[](int a){return a > 3;});
    // std::cout<<*ite<<endl;
    //查找连续count个value,返回第一个元素迭代器
    // auto ite = search_n(v.begin(),v.end(),2,3);
    // cout<<*ite<<endl; 
    // std::vector<int> v2 = {2,3};
    // auto ite = search(v.begin(),v.end(),v2.begin(),v2.end());
    // cout<<*(ite-2)<<endl;

    // auto ite = find_end(v.begin(),v.end(),v2.begin(),v2.end());
    // cout<<*(ite-1)<<endl;

    // auto ite = find_first_of(v.begin(),v.end(),v2.begin(),v2.end());
    // cout<<*ite<<endl;
    // vector<int > v = {1,2,2,3,3,4,2,3,5};
    // auto ite = adjacent_find(v.begin(),v.end());
    // cout<<*ite<<endl;

    // std::string s1 = "hello";
    // std::string s2 = "hemlo";
    // vector<int> v1 = {1,2};
    // vector<int> v2 = {1,2,3};
    // cout<<equal(s1.begin(),s1.end(),s2.begin())<<endl;

    // auto ite = mismatch(s1.begin(),s1.end(),s2.begin());
    // cout<<*ite.first<<" "<<*ite.second<<endl;

    //变动性算法
    // vector<int> v = {1,2,3,4,5};
    // for_each(v.begin(),v.end(),[](int &a){a++;});
    // for_each(v.begin(),v.end(),print);

    // list<int> l = {11,12,13,14,15};
    // vector<int> result;
    // result.resize(10); //预先留好空间
    // copy(v.begin(),v.end(),l.begin());

    //
    // copy_backward(v.begin(),v.end(),l.end());
    //变动完塞入新的区间
    // transform(v.begin(),v.end(),l.begin(),[](int a){return a*2;});
    // merge(v.begin(),v.end(),l.begin(),l.end(),result.begin());
    // fill(v.begin(),v.end(),10);
    // fill_n(v.begin(),3,99);
    //在原区间上变动
    // generate(v.begin(),v.end(),[](){return 100;});
    // generate_n(v.begin(),3,[](){return 100;});

    // replace(v.begin(),v.end(),3,10);
    // replace_if(v.begin(),v.end(),[](int a){return a%2 != 0;},0);

    // replace_copy();
    // replace_copy_if();
    // for_each(v.begin(),v.end(),print);
    // cout<<endl;

    // vector<int> v = {1,2,2,3,4,5};
    // int c = count(v.begin(),v.end(),2);
    // remove(v.begin(),v.end(),2);
    // v.resize(v.size() - c);
    // unique(v.begin(),v.end());
    // for_each(v.begin(),v.end(),print);
    // cout<<endl;
    // cout<<v.size()<<endl; 

    vector<int> v = {10,9,4,6,1};
    // reverse(v.begin(),v.end());

    // rotate(v.begin(),v.begin() + 2,v.end()); 
    //下一个全排列 
    // next_permutation(v.begin(),v.end());
    //上一个全排列
    // prev_permutatation();
    // int a = rand()% 100;
    //设置随机种子，根据时间变化 
    // srand(time(nullptr)); 
    // random_shuffle(v.begin(),v.end());
    stable_partition(v.begin(),v.end(),[](int a){return a%2 == 0;});
    // num < 16 插入排序  num > 16 快排分组  deepth 到底 堆排
    // stable_sort(v.begin(),v.end()); 
    // nth_element(v.begin(),v.begin()+1,v.end());
    make_heap(v.begin(),v.end());
    sort_heap(v.begin(),v.end()); //对堆排序
    for_each(v.begin(),v.end(),print);
    cout<<endl;
    return 0;
} 